/**********************************************************************************************************
** 驱动文件：	ptkt_RS816.c
** 驱动类型：	ptkt
** 设备名称：	普通空调
** 设备型号：	General
** 设备品牌：	常规品牌
** 设备协议：	Modbus
** 驱动描述：	用于普通空调红外控制，适用于学习型空调红外控制器
** 生成日期：	2018-04-03 00:03:36
**********************************************************************************************************/
#include "Includes.h"

typedef struct{								   
	Var current;					//采集到的电流，根据电流判断开关机状态
	Var onoff;						//空调开关控制：0-关机，1-开机
	Var mode;						//运行模式：0-自动，1-制冷，2-制热，3-除湿
	Var set_temp;					//空调设定温度
	Var set_airflow;				//风量设定：0-低，1-中，2-高
}Data_Struct;						//定义变量结构

const static Var_Property_Def var_attr[] = {	//声明变量属性
	{
		FLOAT,
		0,
		READONLY,
		"current",
		"运行电流",		
		"A",
		"根据运行电流，判断开关机",
		0,
		0,
		"空调开机",
		"空调关机",
		0,
		0		
	},
	{
		BOOLEAN,
		0,
		READWRITE,
		"onoff",
		"开关控制",		
		"",
		"空调开关控制：0-关机，1-开机",
		0,
		0,
		"",
		"",
		1,
		1		
	},
	{
		INTEGER,
		0,
		READWRITE,
		"mode",
		"运行模式",		
		"",
		"运行模式：0-制冷，1-制热，2-除湿，3-自动",
		0,
		0,
		"",
		"",
		0,
		1		
	},
	{
		INTEGER,
		0,
		READWRITE,
		"set_temp",
		"温度设定",		
		"℃",
		"温度设定",
		0,
		0,
		"",
		"",
		16,
		1		
	},	
	{
		INTEGER,
		0,
		READWRITE,
		"set_airflow",
		"风量设定",		
		"",
		"风量设定：0-低，1-中，2-高",
		0,
		0,
		"",
		"",
		2,
		1		
	}
};

/**********************************************************************************************************
* 函数名称： static void cmd_func(short index, int addr, void *data, char *cmd, short *len)
* 函数说明： 生成获取传感器数据指令
* 输入参数： 指令索引，传感器地址，变量结构体指针,以及指令缓存区指针,指令长度
* 返回参数： 无
**********************************************************************************************************/
static void cmd_func(short index, int addr, void *data, char *cmd, short *len)
{
	unsigned short	sum;
	Data_Struct 	*d = (Data_Struct*)data;
	switch(index)
	{
		case 0:		//空调设置，并返回控制状态
			if(d->onoff.status||d->mode.status||d->set_temp.status||d->set_airflow.status)
			{
				cmd[0] = 0x7E;
				cmd[1] = 0x00;
				cmd[2] = addr; 						
				cmd[3] = 0x00;
				cmd[4] = (d->mode.value.inum&0x07)|((d->onoff.value.inum<<3)&0x08)|(((d->set_temp.value.inum-16)<<4)&0xf0);				
				sum    = cmd[1] + cmd[2] + cmd[3] + cmd[4];
				cmd[5] = sum>>8;
				cmd[6] = sum;		
				*len = 7;
			}
			else
			{
				*len  = -1;			
			}
			break;	
		case 1:		//获取运行电流
			cmd[0] = addr;
			cmd[1] = 0x07;
			cmd[2] = 0x00;								
			cmd[3] = 0x00;
			cmd[4] = 0x00;	
			cmd[5] = 0x06;
			*len = CRC16_Padding(cmd, 6);
			break;
		default:
			break;
	}
}

/**********************************************************************************************************
* 函数名称： static int parse_func(short index, int addr, void *data, char *buf, short len)
* 函数说明： 解析传感器响应的数据，并写入数据库
* 输入参数： 解析索引,传感器地址，变量结构体指针，以及响应数据缓存取指针，响应数据长度
* 返回参数： 返回解析结果，返回0成功，返回1失败
**********************************************************************************************************/
static int parse_func(short index, int addr, void *data, char *buf, short len)
{
	union{
		short 			dat16;
      	unsigned char  	dat8[2];
    }DAT16_8;						   //数据类型转换	

	Data_Struct 	*d = (Data_Struct*)data;

	if(buf!=NULL  && len>0 )
	{	
		switch(index)
		{
			case 0:
				if(buf[0]==0x7E)
				{
					d->onoff.status			= Normal;
					d->mode.status			= Normal;
					d->set_temp.status		= Normal;
					d->set_airflow.status	= Normal;	
					return 0;
				}
				break;
			case 1:
				if(CRC16_Check(buf,len))
				{
					DAT16_8.dat8[1] = buf[9];
					DAT16_8.dat8[0] = buf[10];
					d->current.value.fnum = DAT16_8.dat16*1.0;
					return 0;
				}				
				break;
		}
	}
	return 1;
}

/**********************************************************************************************************
* 函数名称： void Ptkt_RS816_Registration(void)
* 函数说明： 普通空调注册
* 输入参数： 无
* 返回参数： 无
**********************************************************************************************************/
void Ptkt_RS816_Registration(void)
{
	Device_Registration("ptkt",					//设备类型
						"普通空调",				//设备名称（导航栏默认显示名称）
						"RS-816",				//设备型号
						"普通空调状态监控",		//设备描述
						var_attr,				//变量属性结构 
						sizeof(Data_Struct),	//变量结构体空间大小
						cmd_func,				//发送指令生成函数
						parse_func				//数据解析函数
	);
}

